Jeśli moja strona Ci pomogła, i chcesz aby była bardziej rozwijana, wesprzyj mnie
buy me a coffee
I. Wzorce kreacyjne
II. Wzorce strukturalne
III. Wzorce czynnościowe
|
Fabryka - Metoda wytwórcza - wzorzec projektowy - java
1. Cel:
Wzorzec projektowy Fabryka odpowiada za tworzenie instancji oraz zarządzanie ich cyklem życia podczas ich tworzenia.
Odnosi się do klas o wspólnym interface-e lub podklasy.
2. Problem:
Chcemy tworzyć obiekt bez ujawniania logiki tworzenia i odwołać się do nowo utworzonego obiektu za pomocą wspólnego interfejsu
3. Rozwiązanie:
Fabryka tworzy konkretne klasy, przez sparametryzowane ich tworzenie.
4. Diagram klas wzorca Fabryka:

5. Implementacja:
Pierwszą rzeczą jest stworzenie inteface-u lub podklasy fabryki.
package pl.edu.java.designpatterns.factory;
public interface Lody {
String getNazwa();
double getCena;
int getKalorie();
}
Następnie implementacja konkretnej klasy.
package pl.edu.java.designpatterns.factory;
public class TruskawkoweLody implements Lody {
private String nazwa;
private double cena;
private kalorie;
public TruskawkoweLody(double cena, int kalorie) {
this.nazwa = "Lody Truskawkowe";
this.cena = cena;
this.kalorie = kalorie;
}
public String getNazwa() {
return nazwa;
}
public double getCena() {
return cena;
}
public int getKalorie() {
return kalorie;
}
}
package pl.edu.java.designpatterns.factory;
public class CzekoladoweLody implements Lody {
private String nazwa;
private double cena;
private kalorie;
public TruskawkoweLody(double cena, int kalorie) {
this.nazwa = "Lody czekoladowe";
this.cena = cena;
this.kalorie = kalorie;
}
public String getNazwa() {
return nazwa;
}
public double getCena() {
return cena;
}
public int getKalorie() {
return kalorie;
}
}
Oraz implementacji konkretnej fabryki:
package pl.edu.java.designpatterns.factory;
public class FactoryLody {
private FactoryLody() {}
public static Lody getLody(String typLody) {
switch (typLody) {
case "Truskawkowe":
return new TruskawkoweLody(4.99, 700);
case "Czekoladowe":
return new CzekoladoweLody(3.99, 900);
default:
return null;
}
}
}
Zastosowanie fabryki w klasie klienta.
packge pl.edu.java.designpatterns.factory;
public class LodyTest {
Lody truskawkowe = FactoryLody.getLody("Truskawkowe");
System.out.println(truskawkowe.getNazwa());
}
Czasami chcemy aby argumentem metody fabryki pobierajacej nowy element był parametr String.
Ale dobrym zwyczajem jest użyć enum do wybrania określonego elementu
package pl.edu.java.designpatterns.factory;
public class FactoryLody {
public enum LodyTyp {
TRUSKAWKOWE, CZEKOLADOWE;
}
private FactoryLody() {}
public static Lody getLody(LodyTyp typLody) {
switch (typLody) {
case TRUSKAWKOWE:
return new TruskawkoweLody(4.99, 700);
case CZEKOLADOWE:
return new CzekoladoweLody(3.99, 900);
default:
return null;
}
}
}
Zastosowanie fabryki z typem enum w klasie klienta.
package pl.edu.java.designpatterns.factory;
public class LodyTest {
public static void main(String[] args) {
Lody truskawkowe = FactoryLody.getLody(FactoryLody.LodyTyp.TRUSKAWKOWE);
System.out.println(truskawkowe.getNazwa());
}
}
6. Zastosowanie w kodzie java:
getInstance() używa jest do tworzenia wzorca fabryki, to nie jest singleton:
- java.util.Calendar
- ResourceBundle
- NumberFormat
|